import datetime
from dbutils.pooled_db import PooledDB
import pymysql
from pymysql.cursors import DictCursor

db_config = {
    'host': '82.156.76.242',
    'port': 3306,
    'user': 'root',
    'passwd': 'lige@autoiot123',
    'db': 'allen_demo',
    'charset': 'utf8mb4',
    'maxconnections': 20,  # 连接池允许的最大连接数
    'mincached': 4,  # 初始化时连接池中至少创建的空闲的连接，0表示不创建
    'maxcached': 5,  # 连接池中最多闲置的连接，0表示不限制，连接使用完成后的空闲连接保留数。
    'maxusage': 5,  # 每个连接最多被重复使用的次数，None表示不限制
    'blocking': True  # 连接池中如果没有可用连接后是否阻塞等待，True 等待，让用户等待，尽可能的成功； False 不等待然后报错，尽快告诉用户错误，例如抢购，不成功就提示。
}

mysql_pool = PooledDB(pymysql, **db_config)


def __get_conn():
    conn = mysql_pool.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    return conn, cursor


def __close_conn(conn, cursor):
    cursor.close()
    conn.close()


def __execute(sql, cursor, param=()):
    count = cursor.execute(sql, param)
    return count


def __dict_datetime_obj_to_str(result_dict):
    """把字典里面的datatime对象转成字符串，使json转换不出错"""
    if result_dict:
        result_replace = {k: v.__str__() for k, v in result_dict.items() if isinstance(v, datetime.datetime)}
        result_dict.update(result_replace)
    return result_dict


def select_data(sql, param=()):
    try:
        conn, cur = __get_conn()
        count = __execute(sql, cur, param)
        resList = cur.fetchall()
        [__dict_datetime_obj_to_str(row_dict) for row_dict in resList]
    finally:
        __close_conn(conn, cur)
    return resList


def execute_data(sql, param=()):
    try:
        conn, cur = __get_conn()
        count = __execute(sql, cur, param)
        conn.commit()
    except:
        conn.rollback()
    finally:
        __close_conn(conn, cur)

    return count


def insert_many(sql, values):
    try:
        conn, cur = __get_conn()
        count = cur.executemany(sql, values)
        conn.commit()
    except:
        conn.rollback()
    finally:
        __close_conn(conn, cur)

    return count
